package nu.mulli.clojureshell;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
public abstract class AbstractClassloaderMojo extends AbstractMojo {
enum Scope { RUNTIME, TEST };
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
protected MavenProject project;
/**
* @parameter expression="${clojure.scope}" default-value="runtime"
*/
protected String scope;
/**
* @parameter expression="${clojure.includeStdDirs}" default-value="true"
*/
protected boolean includeStdDirs;
/**
* @parameter expression="${cp}"
*/
protected String classpath;
protected abstract void doExecute() throws Exception;
public void execute() throws MojoExecutionException {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClassLoader(cl));
doExecute();
} catch (Exception e) {
getLog().error(e);
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
}
private ClassLoader getClassLoader(ClassLoader parent) throws DependencyResolutionRequiredException {
Scope sc = Scope.valueOf(scope.toUpperCase());
List<URL> urls = new ArrayList<URL>();
getLog().debug("Creating class loader...");
try {
if(classpath != null) {
addClasspathElements(Arrays.asList(classpath.split(File.pathSeparator)), urls);
}
if (includeStdDirs) {
addClasspathElement("src/main/clojure", urls);
}
addClasspathElements(project.getRuntimeClasspathElements(), urls);
if(sc == Scope.TEST) {
if (includeStdDirs) {
addClasspathElement("src/test/clojure", urls);
}
addClasspathElements(project.getTestClasspathElements(), urls);
}
} catch (MalformedURLException e) {
getLog().error(e);
}
return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
}
private void addClasspathElement(String path, List<URL> urls) throws MalformedURLException {
addClasspathElements(Arrays.asList(path), urls);
}
private void addClasspathElements(List<String> ce, List<URL> urls) throws MalformedURLException {
Iterator<String> iter = ce.iterator();
while (iter.hasNext()) {
URL u = new File(iter.next()).toURL();
getLog().debug("Adding " + u);
urls.add(u);
}
}
}